package cn.echase.ecare.yinfayun.service.impl;

import cn.echase.common.core.exception.EchaseException;
import cn.echase.ecare.operate.manager.api.domain.vo.RemoteFormInfoVo;
import cn.echase.ecare.operate.manager.api.service.IRemoteFormInfoService;
import cn.echase.ecare.yinfayun.constants.AssessConstant;
import cn.echase.ecare.yinfayun.domain.dto.AssessTemplateDto;
import cn.echase.ecare.yinfayun.domain.vo.AssessResultVo;
import cn.echase.ecare.yinfayun.service.IAssessTemplateService;
import cn.echase.ecare.yinfayun.utils.JSONNodeUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static cn.echase.ecare.yinfayun.constants.AssessConstant.AssessCategoryCode.ASSES_TYPE;
import static cn.echase.ecare.yinfayun.constants.AssessConstant.AssessResultJsonKeyStr.PGJG_LEVEL;


@Service
@Slf4j
public class AssessTemplateServiceImpl implements IAssessTemplateService {

    @DubboReference
    private IRemoteFormInfoService iFormInfoService;

    private String transManagerToXiYangYun(String assessStatusManager){
        String assessStatus = AssessConstant.AssessTemplateStatus.OFF;

        if (StrUtil.equalsAny(assessStatusManager, AssessConstant.AssessTemplateStatusManager.CLOSE)){
            assessStatus = AssessConstant.AssessTemplateStatus.OFF;
        }
        if (StrUtil.equalsAny(assessStatusManager, AssessConstant.AssessTemplateStatusManager.OPEN)){
            assessStatus = AssessConstant.AssessTemplateStatus.ON;
        }

        return assessStatus;
    }

    /**
     * 评估状态空值处理
     * */
    private void initAssessStatusManager(RemoteFormInfoVo ecareFormInfoVo){
        if (StrUtil.isBlank(ecareFormInfoVo.getFormStatus())){
            ecareFormInfoVo.setFormStatus(AssessConstant.AssessTemplateStatusManager.OPEN);
        }
    }

    private boolean filerAssessStatusManager(String assessStatusManager){
        return StrUtil.equalsAny(assessStatusManager, AssessConstant.AssessTemplateStatusManager.OPEN, AssessConstant.AssessTemplateStatusManager.CLOSE);
    }

    /**
     * 查询评估模板列表
     *
     * @param assessTemplateDto 查询条件
     * @return 模板列表
     */
    @Override
    public List<AssessTemplateDto> getAssessTemplateList(AssessTemplateDto assessTemplateDto) {
        log.info("[getAssessTemplateList]-assessTemplateDto={}", JSONUtil.toJsonStr(assessTemplateDto));
        this.verifyParamsOrg(assessTemplateDto);
        String orgId = assessTemplateDto.getOrgId();
        String deptId = String.valueOf(LoginHelper.getDeptId());
        List<AssessTemplateDto> assessTemplateDtoList = new ArrayList<>();
        log.info("[getAssessTemplateList],orgId={},deptId={}", orgId, deptId);
        List<RemoteFormInfoVo> remoteFormInfoVoList = iFormInfoService.getFormInfoList(ASSES_TYPE, deptId);
        log.info("[getAssessTemplateList]-remoteFormInfoVoList={}", JSONUtil.toJsonStr(remoteFormInfoVoList));

        for (RemoteFormInfoVo ecareFormInfoVo : remoteFormInfoVoList) {
            // 评估状态空值处理
            this.initAssessStatusManager(ecareFormInfoVo);
            // 过滤掉不需要的状态
            boolean filerAssessStatusManager = this.filerAssessStatusManager(ecareFormInfoVo.getFormStatus());
            if (!filerAssessStatusManager){
                continue;
            }

            AssessTemplateDto assessTemplate = new AssessTemplateDto();
            assessTemplate.setUcId(String.valueOf(ecareFormInfoVo.getId()));
            assessTemplate.setOrgId(orgId);
            assessTemplate.setCategory(String.valueOf(ecareFormInfoVo.getCategory()));
            assessTemplate.setCategoryName(ecareFormInfoVo.getCategoryName());
            assessTemplate.setFormName(ecareFormInfoVo.getFormName());

            // 转换状态
            String assessStatus = this.transManagerToXiYangYun(ecareFormInfoVo.getFormStatus());
            assessTemplate.setStatus(assessStatus);
            assessTemplate.setRemark(ecareFormInfoVo.getRemark());
            assessTemplate.setReportId(ecareFormInfoVo.getReportId());
            assessTemplateDtoList.add(assessTemplate);
        }

        return this.filterTemplate(assessTemplateDtoList, assessTemplateDto);
    }

    /**
     * 根据过滤条件过滤出正确的模板
     * */
    public List<AssessTemplateDto> filterTemplate(List<AssessTemplateDto> assessTemplateDtoList, AssessTemplateDto assessTemplateDto){
        log.info("[filterTemplate],assessTemplateDtoList={},assessTemplateDto={}", JSONUtil.toJsonStr(assessTemplateDtoList), JSONUtil.toJsonStr(assessTemplateDto));
        if (CollUtil.isEmpty(assessTemplateDtoList)){
            return new ArrayList<>();
        }

        List<AssessTemplateDto> assessTemplateDtoList1 = new ArrayList<>();
        for (AssessTemplateDto templateDto : assessTemplateDtoList) {
            String formName = templateDto.getFormName();
            String category = templateDto.getCategory();
            String assessStatus = templateDto.getStatus();
            String assessStatusReq = assessTemplateDto.getStatus();
            String formNameReq = assessTemplateDto.getFormName();
            String categoryReq = assessTemplateDto.getCategory();

            boolean filter = true;
            if (StrUtil.isNotBlank(formNameReq)){
                if (!StrUtil.contains(formName, formNameReq)){
                    filter = false;
                }
            }

            if (filter){
                if (StrUtil.isNotBlank(categoryReq)){
                    if (!StrUtil.equals(category, categoryReq)){
                        filter = false;
                    }
                }
            }

            if (filter){
                if (StrUtil.isNotBlank(assessStatusReq)){
                    if (!StrUtil.equals(assessStatus, assessStatusReq)){
                        filter = false;
                    }
                }
            }

            if (filter){
                assessTemplateDtoList1.add(templateDto);
            }
        }

        log.info("[filterTemplate],assessTemplateDtoList1={}", JSONUtil.toJsonStr(assessTemplateDtoList1));
        return  assessTemplateDtoList1;
    }

    /**
     * 校验入参-查询评估模板详情
     * */
    public void verifyParamsInfo(AssessTemplateDto assessTemplateDto){
        if (StringUtils.isEmpty(assessTemplateDto.getUcId())) {
            throw new EchaseException(400, "评估模板ID不能为空");
        }
    }

    /**
     * 校验入参-orgId
     * */
    public void verifyParamsOrg(AssessTemplateDto assessTemplateDto){
        if (StringUtils.isEmpty(assessTemplateDto.getOrgId())) {
            throw new EchaseException(400, "机构ID不能为空");
        }
    }

    /**
     * 查询评估模板详情
     *
     * @param assessTemplateDto 查询条件
     * @return 模板详情
     */
    @Override
    public AssessTemplateDto getAssessTemplateInfo(AssessTemplateDto assessTemplateDto) throws Exception {
        this.verifyParamsOrg(assessTemplateDto);
        this.verifyParamsInfo(assessTemplateDto);
        return this.getAssessTemplateInfoDto(Long.parseLong(assessTemplateDto.getUcId()));
    }

    /**
     * 根据orgId、formInfoId获取模板信息
     * */
    private AssessTemplateDto getAssessTemplateInfoDto(Long formInfoId) throws Exception {
        log.info("[getAssessTemplateInfoDto]-[getFormInfoById],formInfoId={}", formInfoId);
        AssessTemplateDto assessTemplateResDto = new AssessTemplateDto();
        RemoteFormInfoVo remoteFormInfoVo = iFormInfoService.getFormInfoById(formInfoId);
        log.info("[getAssessTemplateInfoDto]-[getFormInfoById],remoteFormInfoVo={}", JSONUtil.toJsonStr(remoteFormInfoVo));
        if (remoteFormInfoVo != null) {
            BeanUtil.copyProperties(remoteFormInfoVo, assessTemplateResDto);
            JSONArray resultArray = this.getFormOptions(assessTemplateResDto, PGJG_LEVEL);
            assert resultArray != null;
            assessTemplateResDto.setResultContent(resultArray.toString());
        }else {
            throw new EchaseException(400,"未找到评估模板内容信息");
        }
        return assessTemplateResDto;
    }

    /**
     * 查询评估模板对应的评估结果字典列表
     *
     * @param assessTemplateDto 查询条件
     * @return 评估结果字典列表
     */
    @Override
    public List<AssessResultVo> getAssessTemplateResultList(AssessTemplateDto assessTemplateDto) throws Exception {
        List<AssessResultVo> list = new ArrayList<>();
        AssessTemplateDto assessTemplate = this.getAssessTemplateInfo(assessTemplateDto);
        if(StringUtils.isNotEmpty(assessTemplate.getResultContent())){

            ObjectMapper objectMapper = new ObjectMapper();
            JSONArray jsonArray = objectMapper.readValue(assessTemplate.getResultContent(), JSONArray.class);

            for (int i = 0; i < jsonArray.size(); i++) {
                AssessResultVo assessResultVo = new AssessResultVo();
                JSONObject result = jsonArray.getJSONObject(i);
                assessResultVo.setLabel(result.getString("label"));
                assessResultVo.setValue(result.getString("value"));
                list.add(assessResultVo);
            }
        }
        return list;
    }

    private JSONArray getFormOptions(AssessTemplateDto formInfo, String optionName) throws Exception {
        Optional<JSONObject> jsonObject = Optional.ofNullable(formInfo).map(f -> JSONObject.parseObject(f.getFormContent()));
        if (jsonObject.isPresent()) {
            JSONObject assessDate1 = JSONNodeUtil.findNodeByName(optionName, jsonObject.get());
            if (assessDate1 != null && assessDate1.containsKey("optionItems")) {
                return assessDate1.getJSONArray("optionItems");
            }
        }
        return null;
    }

}
